TIM定时器
我们用去控制小风扇和舵机转起来!
up的视频讲解:
1 定时器 原理
1.1 定时器简介
定时器 即用来定时的器件,在STM32单片机定时器是一种外设。STM32F103C8T6总共有4个定时器,分别是
-
1个
高级定时器(TIM1)- 挂载在 APB2总线上 -
3个
通用定时器(TIM2、TIM3、TIM4)- 挂载在 ABP1总线上

定时器主要有一下3大功能, 本教程都安排了对应的实验
-
定时中断 用于麦克风 ADC采集实验
-
PWM输出 用于电机, 舵机 PWM控制实验
-
输入捕获 用于编码器 实验
我们需要掌握定时器的哪些知识呢?
-
工作模式
-
溢出模式:计数器计满最大值,清零并产生 中断/事件
-
比较模式:计数器数值 = 预设比较值 时触发 中断/事件
-
-
利用系SysTick(系统滴答定时器),在主循环里轮询时间差,纯软件判断是否超时
-
优点:不占用硬件外设、数量不限、配置简单
-
缺点:依赖主循环,程序阻塞时计时不准
1.2 什么是PWM?
PWM(Pulse Width Modulation,脉冲宽度调制),简单说就是用 “固定频率、可变占空比” 的方波

-
CNT计数值随着时间的推进会不断经历从0到ARR,清零复位再到ARR的这一过程
-
通过调节
ARR(Auto-Reload Register自动重装载寄存器)的值可以调节PWM的周期 -
调节
CCR(Capture/Compare Register捕获/比较寄存器)的值大小可以调节PWM占空比
1.2 计数模式 与 对齐模式
计数模式是 “计数器怎么数”,对齐模式是 “PWM 脉冲和周期起点的相对位置”,两者是因果关系
计数模式

-
中央对齐模式:计数器从0开始计数到自动重装载值
ARR-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件, 然后再从0开始重新计数 -
向上计数模式:计数器从0计数到自动重装载值
ARR,然后重新从0开始计数并且产生一个计数器溢出事件 -
向下计数模式:计数器从自动装入的值
ARR开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件
对齐模式
对齐模式决定 PWM 脉冲的位置
-
边沿对齐:PWM 脉冲的一个边沿(上升沿 / 下降沿)和周期起点(CNT=0 或 CNT=ARR)对齐
-
中心对齐:PWM 脉冲以周期中点为中心,左右对称分布
1.4 定时器计算公式
- 定时器频率
定时器频率CK_CNT = 定时器输入时钟 / (PSC + 1)
-
定时器输入时钟:APB1 或 APB2 时钟(常用72MHz)
-
PSC:预分频器(0~65535)
- 定时周期
定时周期 = (PSC + 1) * (ARR + 1) / 定时器输入时钟
- ARR:自动重装载值
- PWM 频率
PWM频率 = 定时器频率CK_CNT / (ARR + 1)
PWM频率 = 定时器输入时钟 / [(PSC + 1) * (ARR + 1)]
- PWM 占空比
占空比 = CRR / (ARR + 1)
中心对齐时,周期会变长一倍
2 高级定时器

高级定时器是最复杂的, 通用定时器和基本定时器都是对它功能的裁剪,我们可以把它分为四个部分来看
2.1 时钟来源

-
内部时钟(
CK_INT):由 RCC 外设提供, 所有定时 / PWM 功能默认都用它。 -
外部触发时钟(
ETR): 把外部 ETR 引脚的脉冲作为时钟源 -
内部互联触发(
ITR0~ITR3):来自其他定时器(比如 TIM2、TIM3 等)的内部触发信号, 实现定时器级联, -
编码器接口时钟(
TI1FP1/TI2FP2): 直接支持正交编码器输入,把编码器的 A/B 相脉冲转换成计数时钟,实现电机位置 / 速度测量 -
同步输出(
TRGO)把定时器的溢出 / 比较事件同步触发给外设
2.2 时基单元

这是定时器的 “心脏”,决定了定时周期、溢出频率,是所有功能的基础
-
PSC预分频器: 间的任意值进行分频,可在运行时改变其设置值 -
CNT计数器: 核心计数寄存器,按 CK_CNT 脉冲计数 支持向上 / 向下 / 中央对齐计数 -
ARR自动重装载寄存器: 设定计数上限,CNT 计数到 ARR 时触发更新事件 决定定时周期的核心参数 -
REP重复计数器(高级定时器特有): 设置 “每溢出 N 次才触发一次更新”,减少中断频率 -
计数模式:
-
向上计数:CNT 从 0 递增到 ARR,溢出后归零
-
向下计数:CNT 从 ARR 递减到 0,下溢后回到 ARR
-
中央对齐模式:CNT 从 0 递增到 ARR,再递减到 0
-
2.3 定时器输入

这部分是 “输入捕获” 通道,用于测量外部信号的频率、脉宽、周期等参数, 信号处理流程:
-
外部信号从
TIMx_CH引脚进入 -
滤波与边沿检测, 生成
TI1FP信号 -
经过
Prescaler分频,降低捕获触发频率; -
硬件自动将当前CNT的值锁存到
Capture/Compare Register
2.4 定时器输出

高级定时器的输出,核心是基于计数器 CNT 和捕获 / 比较寄存器 CCRx 的比较结果,来控制引脚电平
-
当计数器 CNT 的值,和 CCRx 寄存器的值匹配时
-
硬件会自动改变输出状态,从而生成 PWM 脉冲、定时信号等
-
DTG死区时间(高级定时器特有): 就是互补信号切换时,插入的一小段 “上下管都关断” 的时间,防止电源直通烧毁 MOS 管 -
BRK刹车保护(高级定时器特有): 是一个硬件引脚,当外部故障(过流、过温)触发时,会瞬间强制关闭所有 PWM 输出,把驱动管拉到安全电平
3 通用定时器

通用定时器和高级定时器只是缺少了一些部件, 整体框架结构都相同
-
REP重复计数器(高级定时器特有): 设置 “每溢出 N 次才触发一次更新”,减少中断频率 -
DTG死区时间(高级定时器特有): 就是互补信号切换时,插入的一小段 “上下管都关断” 的时间,防止电源直通烧毁 MOS 管 -
BRK刹车保护(高级定时器特有): 是一个硬件引脚,当外部故障(过流、过温)触发时,会瞬间强制关闭所有 PWM 输出,把驱动管拉到安全电平
4 基本定时器

(F103C8T6型号没有)基本定时器就简单很多, 相当于将高级定时器裁剪到只留下 时钟来源 + 时基单元
-
使能后,CNT从 0 开始,按CK_CNT脉冲递增计数
-
当CNT的值等于ARR的值时,触发更新事件
-
CNT自动清零,重新开始计数
5 定时器相关外设
-
实时时钟(RTC): 独立于主系统时钟的低功耗计数器,通常由 32.768kHz 晶振(LSE) 或内部低速 RC(LSI)驱动
-
独立看门狗(IWDG): 由独立低速 RC 时钟(LSI, 40kHz)驱动的递减计数器,一旦启动就无法关闭。程序必须在规定时间内定期 “喂狗”(重置计数器),否则计数器归零后触发系统复位。
-
窗口看门狗(WWDG): 由 APB1 时钟驱动,有一个 “喂狗窗口”—— 程序必须在计数器递减到指定上界和下界之间喂狗,提前或超时喂狗都会触发复位。